package com.linzm.leetcode.mid.exercises2_20230211;

import java.util.*;

/**
 * @Author zimingl
 * @Date 2023/2/14 23:39
 * @Description: 表现良好的最长时间段
 * 给你一份工作时间表 hours，上面记录着某一位员工每天的工作小时数。
 * 我们认为当员工一天中的工作小时数大于 8 小时的时候，那么这一天就是「劳累的一天」。
 * 所谓「表现良好的时间段」，意味在这段时间内，「劳累的天数」是严格 大于「不劳累的天数」。
 * 请你返回「表现良好时间段」的最大长度。
 * <p>
 * 输入：hours = [9,9,6,0,6,6,9]
 * 输出：3
 * 解释：最长的表现良好时间段是 [9,9,6]。
 * 输入：hours = [6,6,6]
 * 输出：0
 * <p>
 * 1 <= hours.length <= 104
 * 0 <= hours[i] <= 16
 */
public class Demo10_1124 {
    public static void main(String[] args) {
        int[] hours = {6, 0, 6, 6, 9};
        Demo10_1124 demo10_1124 = new Demo10_1124();
        int longestWPI = demo10_1124.longestWPI(hours);
        System.out.println(longestWPI);
    }

    private int longestWPI(int[] hours) {
        Deque<Integer> stack = new LinkedList<>();
        int[] arr = new int[hours.length];
        for (int i = 0; i < hours.length; i++) {
            if (hours[i] > 0) {
                arr[i] = 1;
            } else {
                arr[i] = 0;
            }
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > 1) {

            }
        }
        return 0;
    }

    public int longestWPI2(int[] hours) {
        int n = hours.length;
        Map<Integer, Integer> map = new HashMap<>();
        int s = 0, res = 0;
        for (int i = 0; i < n; i++) {
            s += hours[i] > 8 ? 1 : -1;
            if (s > 0) {
                res = Math.max(res, i + 1);
            } else {
                if (map.containsKey(s - 1)) {
                    res = Math.max(res, i - map.get(s - 1));
                }
            }
            if (!map.containsKey(s)) {
                map.put(s, i);
            }
        }
        return res;
    }

    public int longestWPI3(int[] hours) {
        int n = hours.length;
        int[] s = new int[n + 1];
        Deque<Integer> stk = new ArrayDeque<>();
        stk.push(0);
        for (int i = 1; i <= n; i++) {
            s[i] = s[i - 1] + (hours[i - 1] > 8 ? 1 : -1);
            if (s[stk.peek()] > s[i]) {
                stk.push(i);
            }
        }

        int res = 0;
        for (int r = n; r >= 1; r--) {
            while (!stk.isEmpty() && s[stk.peek()] < s[r]) {
                res = Math.max(res, r - stk.pop());
            }
        }
        return res;
    }
}
